#ifndef PLUGINFACTORY_H_
#define PLUGINFACTORY_H_

//std headers
#include <map>
#include <string>

//project headers
#include "IPlugin.h"

namespace PluginSystem
{

//! PluginFactory
/*!
	Trieda sluzi na vytvaranie instancii Pluginov nachadzajucich 
	sa v dynamicky nahravatelnych kniznicach (dll, so ).
	Tato Fakctory je specificka pre Convertor pluginy. Na inde pluginy
	treba pouzit ine faktory !

	Trieda by mala byt umiestnena v Singleton Holdery.
*/
class PluginFactory
{
	public:
		
		//! Konstruktor
		/*!
			Zakladny konstruktor, ktory vytvori instanciu triedy a
			zaisti zakladnu inicializaciu objektu.
			Tento konstruktor taktiez zaregistruje IPluginConvertor ako
			triedu,z ktorej sa budu vytvarat instancie!
		*/
		PluginFactory(void);

		//! Destruktor
		/*!
			Sluzi na spravne uvolnenie vsetkych zdrojov, prisluchajucich
			k danemu objektu
		*/
		~PluginFactory(void);

		//! Register(Plugin)
		/*!
			Funkcia sluzi na zaregistrovanie noveho pluginu do tovarne.
			Vytvarat instancie urcitehej triedy je mozne az po zaregistrovani
			sa do PluginFactory.
			\param pluginName nazov pluginu ktory sa registuje(musi byt jedinecny nazov)
			\param createPluginfunc funkcia na vytvaranie instancii konkretneho pluginu
			\return true ak prebiehla uspesna registracia, false inak
		*/
		bool Register(std::string pluginName,CreatePluging createPluginfunc);

	
		//! Create
		/*!
			Funkcia vytvori instanciu objektu zadaneho typu, ktory reprezentuje nejaky
			plugin ktoreho cesta je udana plnou cestou k pluginu
			\param std::string pluginName nazov(typ) pluginu
			\param std::string pluginPath cesta k pluginu
			\return IPlugin * instancia daneho pluginu ,alebo null v pripade zlihania
		*/
		IPlugin *Create(std::string pluginName,std::string pluginPath);

	private:
		//////////////////////////////////////////////////////////////////////////
		//						MEMBER VARIABLES
		//////////////////////////////////////////////////////////////////////////
		typedef std::map<std::string,CreatePluging> ObjectMap;
		ObjectMap myObjectMap;

};//end of PluginFactory class

}//end of PluginSystem namespace

#endif //PLUGINFACTORY_H_
